package com.example.eureka.listener;

import com.netflix.appinfo.InstanceInfo;
import org.springframework.cloud.netflix.eureka.server.event.*;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;

/**
 * 注意：
 * 1. 在续约的时候,eureka会发出2条EurekaInstanceRenewedEvent事件,但是2条事件的属性却不一样!一个事件的属性replication为true,
 * 另外一个为false
 * 2. 每个客户端服务在注册中心集群中只会触发一个注册中心的事件
 */
@Component
public class EurekaStateListener{

    /**
     * 服务下线监听器
     * @param event 服务下线事件
     */
    @EventListener
    public void listen(EurekaInstanceCanceledEvent event) {
        String msg="服务"+event.getAppName()+"  "+event.getServerId()+"已下线";

        System.out.println(msg);
    }

    /**
     * 服务注册监听器
     * @param event 服务注册事件
     */
    @EventListener
    public void listen(EurekaInstanceRegisteredEvent event) {
        InstanceInfo instanceInfo = event.getInstanceInfo();
        String msg="服务"+instanceInfo.getAppName()+"  "+  instanceInfo.getHostName()+":"+ instanceInfo.getPort()+ " ip: " +instanceInfo.getIPAddr() +"进行注册";
        System.out.println("LeaseDuration："+event.getLeaseDuration());
        System.out.println(msg);
    }

    /**
     * 服务续约(发送心跳)监听器
     * 在续约的时候,eureka会发出2条EurekaInstanceRenewedEvent事件,但是2条事件的属性却不一样!
     * 一个事件的属性replication为true,另外一个为false.如果我们只想处理replication=false的事件
     * 则配置下面的
     * @param event 服务续约事件
     */
    @EventListener(condition = "#event.replication==false")
    public void listen(EurekaInstanceRenewedEvent event) {
        System.out.println("事件的replication："+event.isReplication());
        System.out.println("服务进行续约"+event.getServerId()+" "+event.getAppName());
    }

    /**
     * 注册中心启动监听器
     * @param event 注册中心启动事件
     */
    @EventListener
    public void listen(EurekaRegistryAvailableEvent event) {
        System.out.println("事件最初发生的对象："+event.getSource());
        System.out.println("注册中心启动时间:"+event.getTimestamp());
    }

    /**
     * eureka服务端启动监听器
     * @param event eureka服务端启动事件
     */
    @EventListener
    public void listen(EurekaServerStartedEvent event) {
        System.out.println("事件最初发生的对象："+event.getSource());
        System.out.println("注册中心服务端启动时间："+event.getTimestamp());
    }
}
